package main

import (
	"fmt"
	"io"
	"os"
)

// 指定位置插入
func writeLocation() {
	// 打开源文件
	fileObj, err := os.OpenFile("./src.txt", os.O_RDWR, 0644)
	if err != nil {
		fmt.Printf("open failed, err:%v.\n", err)
		return
	}
	// defer fileObj.Close()

	// 因为没办法直接在原文件中间插入内容，因此借助临时文件实现
	tempFile, err := os.OpenFile("./temp.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
	if err != nil {
		fmt.Printf("open failed, err:%v.\n", err)
		return
	}
	// defer tempFile.Close()

	// 读取插入位置光标前的内容写入临时文件
	var startOfFile [1]byte
	n, err := fileObj.Read(startOfFile[:])
	if err != nil {
		fmt.Printf("read from file's start failed, err:%v.\n", err)
		return
	}
	tempFile.Write(startOfFile[:n])
	fmt.Println("开始", string(startOfFile[:n]))

	// 再写入待插入内容
	var middleOfFile = []byte{'b'}
	fmt.Println("中间待插入", string(middleOfFile))
	tempFile.Write(middleOfFile)

	// 原文件后续内容写入临时文件
	var endOfFile [1024]byte
	// for n,err:=fileObj.Read(end_file[:]);err!=nil;{}
	for {
		n, err := fileObj.Read(endOfFile[:])
		if err == io.EOF {
			tempFile.Write(endOfFile[:n])
			fmt.Println("结尾内容", string(endOfFile[:n]))
			break
		}
		if err != nil {
			fmt.Printf("read from file's end failed, err:%v.\n", err)
			return
		}
		tempFile.Write(endOfFile[:n])
		fmt.Println("结尾内容", string(endOfFile[:n]))

	}

	// 关闭文件，并重命名覆盖
	fileObj.Close()
	tempFile.Close()
	// 临时文件重命名为原文件名字->实现覆盖
	os.Rename("./temp.txt", "./src.txt")
}

func main() {
	writeLocation()
}
